import { Controller, Get, Query } from '@nestjs/common';
import { PatternAnalyzer } from '../utils/genju';
import { BaziService } from '../bazi/bazi.service';
import { DatabaseService } from '../database/database.service';

@Controller('docs')
export class DocsController {
  private patternAnalyzer: PatternAnalyzer

  constructor(
    private readonly baziService: BaziService,
    private readonly databaseService: DatabaseService,
  ) {
    this.patternAnalyzer = new PatternAnalyzer();
  }

  private static readonly PATTERN_MAP: Record<string, string> = {
    // 普通格局
    // 根据古籍原文《滴天髓》"论正官格"内容，主要讨论官杀混杂问题，只涉及正官、七杀、伤官格
    '正官格': '论正官格', '七杀格': '论七杀格', '伤官格': '论伤官格',
    // 正财格、偏财格、正印格、偏印格、比肩格、劫财格在b02中无对应标题，不符合古籍理论，不映射
    // '正财格': 不映射（b02中无对应标题，不符合古籍理论）
    // '偏财格': 不映射（b02中无对应标题，不符合古籍理论）
    // '正印格': 不映射（b02中无对应标题，不符合古籍理论）
    // '偏印格': 不映射（b02中无对应标题，不符合古籍理论）
    // '比肩格': 不映射（b02中无对应标题，不符合古籍理论）
    // '劫财格': 不映射（b02中无对应标题，不符合古籍理论）
    '食神格': '论伤官格', // 古籍中食神格与伤官格常一起讨论
    // 普通格局破格版本
    '正官格（破格）': '论正官格', '七杀格（破格）': '论七杀格', '伤官格（破格）': '论伤官格',
    // 其他格局破格版本在b02中无对应标题，不映射
    '食神格（破格）': '论伤官格',
    // 杂气格
    // 注意：杂气正印格和偏印格按古籍理论应归"杂气印绶格"，但b02中只有"杂气财官格"
    // 根据古籍原文，b02中没有"论杂气印绶格"，所以杂气印绶格不映射，避免强行对应
    '杂气正官格': '论杂气财官格', '杂气七杀格': '论杂气财官格', '杂气伤官格': '论伤官格',
    '杂气正财格': '论杂气财官格', '杂气偏财格': '论杂气财官格',
    // '杂气正印格': 不映射到论杂气财官格（不符合古籍理论，b02中也没有对应的正确标题）
    // '杂气偏印格': 不映射到论杂气财官格（不符合古籍理论，b02中也没有对应的正确标题）
    '杂气食神格': '论伤官格',
    // '杂气比肩格': 不映射（b02中无对应标题，不符合古籍理论）
    // '杂气劫财格': 不映射（b02中无对应标题，不符合古籍理论）
    // 杂气格破格版本
    '杂气正官格（破格）': '论杂气财官格', '杂气七杀格（破格）': '论杂气财官格', '杂气伤官格（破格）': '论伤官格',
    '杂气正财格（破格）': '论杂气财官格', '杂气偏财格（破格）': '论杂气财官格',
    // '杂气正印格（破格）': 不映射到论杂气财官格（不符合古籍理论）
    // '杂气偏印格（破格）': 不映射到论杂气财官格（不符合古籍理论）
    '杂气食神格（破格）': '论伤官格',
    // '杂气比肩格（破格）': 不映射（b02中无对应标题）
    // '杂气劫财格（破格）': 不映射（b02中无对应标题）
    // 从弱格
    '从儿格': '论从儿格', '从官格': '论真从假从', '从杀格': '论真从假从', '从财格': '论真从假从',
    '从儿格（破格）': '论从儿格', '从官格（破格）': '论真从假从', '从杀格（破格）': '论真从假从', '从财格（破格）': '论真从假从',
    // 专旺格
    '炎上格': '论方局', '润下格': '论方局', '从革格': '论方局', '曲直格': '论方局', '稼穑格': '论一行独气',
    '炎上格（破格）': '论方局', '润下格（破格）': '论方局', '从革格（破格）': '论方局', '曲直格（破格）': '论方局', '稼穑格（破格）': '论一行独气',
    // 特殊格局
    // 建禄格、羊刃格在b02中无对应标题，不符合古籍理论，不映射
    // '建禄格': 不映射（b02中无对应标题，不符合古籍理论）
    // '羊刃格': 不映射（b02中无对应标题，不符合古籍理论）
    // '建禄格（破格）': 不映射（b02中无对应标题）
    // '羊刃格（破格）': 不映射（b02中无对应标题）
  };


  // 天干五行映射
  private static readonly STEM_WUXING_MAP: Record<string, string> = {
    '甲': '木', '乙': '木',
    '丙': '火', '丁': '火',
    '戊': '土', '己': '土',
    '庚': '金', '辛': '金',
    '壬': '水', '癸': '水'
  };

  // 地支五行映射
  private static readonly BRANCH_WUXING_MAP: Record<string, string> = {
    '子': '水', '亥': '水',
    '寅': '木', '卯': '木',
    '巳': '火', '午': '火',
    '申': '金', '酉': '金',
    '辰': '土', '戌': '土', '丑': '土', '未': '土'
  };

  // 格局到 b05 标题的映射
  private static readonly PATTERN_B05_MAP: Record<string, string[]> = {
    // 专旺格
    '炎上格': ['论专旺格'],
    '润下格': ['论专旺格'],
    '从革格': ['论专旺格'],
    '曲直格': ['论专旺格'],
    '稼穑格': ['论专旺格'],
    '炎上格（破格）': ['论专旺格'],
    '润下格（破格）': ['论专旺格'],
    '从革格（破格）': ['论专旺格'],
    '曲直格（破格）': ['论专旺格'],
    '稼穑格（破格）': ['论专旺格'],
    // 建禄格
    '建禄格': ['论建禄月劫'],
    '建禄格（破格）': ['论建禄月劫'],
    // 羊刃格
    '羊刃格': ['论阳刃'],
    '羊刃格（破格）': ['论阳刃'],
    // 从弱格
    '从杀格': ['论弃命从煞格'],
    '从杀格（破格）': ['论弃命从煞格'],
    '从财格': ['论弃命从财格'],
    '从财格（破格）': ['论弃命从财格'],
    '从官格': ['论弃命从煞格'],
    '从官格（破格）': ['论弃命从煞格'],
    '从儿格': ['论伤官'],
    '从儿格（破格）': ['论伤官']
  };

  // 十神到 b05 标题的映射
  private static readonly TEN_STAR_B05_MAP: Record<string, string[]> = {
    '正官': ['论正官'],
    '七杀': ['论偏官'],
    '偏官': ['论偏官'],
    '正印': ['论印绶'],
    '偏印': ['论印绶'],
    '正财': ['论财'],
    '偏财': ['论财'],
    '食神': ['论食神'],
    '伤官': ['论伤官']
  };

  // 月支到月份的映射（建候）
  private static readonly BRANCH_MONTH_MAP: Record<string, { month: number; name: string }> = {
    '寅': { month: 1, name: '正月建寅候' },
    '卯': { month: 2, name: '二月建卯候' },
    '辰': { month: 3, name: '三月建辰候' },
    '巳': { month: 4, name: '四月建巳候' },
    '午': { month: 5, name: '五月建午候' },
    '未': { month: 6, name: '六月建未候' },
    '申': { month: 7, name: '七月建申候' },
    '酉': { month: 8, name: '八月建酉候' },
    '戌': { month: 9, name: '九月建戌候' },
    '亥': { month: 10, name: '十月建亥候' },
    '子': { month: 11, name: '十一月建子候' },
    '丑': { month: 12, name: '十二月建丑候' }
  };

  // 格局到 b06 标题的映射
  private static readonly PATTERN_B06_MAP: Record<string, string[]> = {
    '从革格': ['论从革格'],
    '从革格（破格）': ['论从革格'],
    '曲直格': ['论曲直格'],
    '曲直格（破格）': ['论曲直格'],
    '润下格': ['论润下格'],
    '润下格（破格）': ['论润下格'],
    '炎上格': ['论炎上格'],
    '炎上格（破格）': ['论炎上格'],
    '稼穑格': ['论稼穑格'],
    '稼穑格（破格）': ['论稼穑格'],
    '杂气正印格': ['论杂气印绶格'],
    '杂气偏印格': ['论杂气印绶格'],
    '杂气正印格（破格）': ['论杂气印绶格'],
    '杂气偏印格（破格）': ['论杂气印绶格'],
    '杂气正官格': ['论杂气财官格'],
    '杂气七杀格': ['论杂气财官格'],
    '杂气正财格': ['论杂气财官格'],
    '杂气偏财格': ['论杂气财官格'],
    '杂气正官格（破格）': ['论杂气财官格'],
    '杂气七杀格（破格）': ['论杂气财官格'],
    '杂气正财格（破格）': ['论杂气财官格'],
    '杂气偏财格（破格）': ['论杂气财官格'],
    '正官格': ['论正官格'],
    '正官格（破格）': ['论正官格'],
    '正印格': ['论印绶格'],
    '偏印格': ['论印绶格'],
    '正印格（破格）': ['论印绶格'],
    '偏印格（破格）': ['论印绶格'],
    '从杀格': ['论弃命从杀格'],
    '从杀格（破格）': ['论弃命从杀格'],
    '从官格': ['论弃命从杀格'],
    '从官格（破格）': ['论弃命从杀格'],
    '从财格': ['论弃命从财格'],
    '从财格（破格）': ['论弃命从财格']
  };

  // 十神到 b06 标题的映射
  private static readonly TEN_STAR_B06_MAP: Record<string, string[]> = {
    '正官': ['论正官'],
    '七杀': ['论偏官', '论七杀'],
    '偏官': ['论偏官', '论七杀'],
    '正印': ['论印绶'],
    '偏印': ['论印绶', '论倒食'],
    '正财': ['论正财'],
    '偏财': ['论偏财'],
    '食神': ['论食神'],
    '伤官': ['论伤官'],
    '劫财': ['论劫财']
  };

  // 格局到 b09 标题的映射
  private static readonly PATTERN_B09_MAP: Record<string, string[]> = {
    // 普通格局
    '正官格': ['论正官格', '论正官'],
    '正官格（破格）': ['论正官格', '论正官'],
    '七杀格': ['论七杀格', '论七杀'],
    '七杀格（破格）': ['论七杀格', '论七杀'],
    '伤官格': ['论伤官格', '论伤官'],
    '伤官格（破格）': ['论伤官格', '论伤官'],
    '食神格': ['论食神格', '论食神'],
    '食神格（破格）': ['论食神格', '论食神'],
    '正印格': ['论偏正印格', '论偏正印'],
    '正印格（破格）': ['论偏正印格', '论偏正印'],
    '偏印格': ['论偏正印格', '论偏正印'],
    '偏印格（破格）': ['论偏正印格', '论偏正印'],
    '正财格': ['论偏正财格', '论偏正财'],
    '正财格（破格）': ['论偏正财格', '论偏正财'],
    '偏财格': ['论偏正财格', '论偏正财'],
    '偏财格（破格）': ['论偏正财格', '论偏正财'],
    '比肩格': ['论比劫禄刃'],
    '比肩格（破格）': ['论比劫禄刃'],
    '劫财格': ['论比劫禄刃'],
    '劫财格（破格）': ['论比劫禄刃'],
    // 杂气格
    '杂气正官格': ['论正官格', '论正官'],
    '杂气正官格（破格）': ['论正官格', '论正官'],
    '杂气七杀格': ['论七杀格', '论七杀'],
    '杂气七杀格（破格）': ['论七杀格', '论七杀'],
    '杂气伤官格': ['论伤官格', '论伤官'],
    '杂气伤官格（破格）': ['论伤官格', '论伤官'],
    '杂气食神格': ['论食神格', '论食神'],
    '杂气食神格（破格）': ['论食神格', '论食神'],
    '杂气正印格': ['论偏正印格', '论偏正印'],
    '杂气正印格（破格）': ['论偏正印格', '论偏正印'],
    '杂气偏印格': ['论偏正印格', '论偏正印'],
    '杂气偏印格（破格）': ['论偏正印格', '论偏正印'],
    '杂气正财格': ['论偏正财格', '论偏正财'],
    '杂气正财格（破格）': ['论偏正财格', '论偏正财'],
    '杂气偏财格': ['论偏正财格', '论偏正财'],
    '杂气偏财格（破格）': ['论偏正财格', '论偏正财'],
    '杂气比肩格': ['论比劫禄刃'],
    '杂气比肩格（破格）': ['论比劫禄刃'],
    '杂气劫财格': ['论比劫禄刃'],
    '杂气劫财格（破格）': ['论比劫禄刃'],
    // 从弱格
    '从儿格': ['论从儿格'],
    '从儿格（破格）': ['论从儿格'],
    '从杀格': ['论从杀格'],
    '从杀格（破格）': ['论从杀格'],
    '从财格': ['论从财格'],
    '从财格（破格）': ['论从财格'],
    '从官格': ['论从杀格'],
    '从官格（破格）': ['论从杀格'],
    // 专旺格（从旺格、从强格可能是专旺格的别名）
    '炎上格': ['论炎上格'],
    '炎上格（破格）': ['论炎上格'],
    '润下格': ['论润下格'],
    '润下格（破格）': ['论润下格'],
    '从革格': ['论从革格'],
    '从革格（破格）': ['论从革格'],
    '曲直格': ['论曲直格'],
    '曲直格（破格）': ['论曲直格'],
    '稼穑格': ['论稼穑格'],
    '稼穑格（破格）': ['论稼穑格'],
    // 特殊格局
    '建禄格': ['论建禄格', '论比劫禄刃'],
    '建禄格（破格）': ['论建禄格', '论比劫禄刃'],
    '羊刃格': ['论月刃格', '论比劫禄刃'],
    '羊刃格（破格）': ['论月刃格', '论比劫禄刃'],
    // 其他格局（可能存在但较少使用）
    '从强格': ['论从强格'],
    '从强格（破格）': ['论从强格'],
    '从旺格': ['论从旺格'],
    '从旺格（破格）': ['论从旺格'],
    '化气格': ['论化气格'],
    '化气格（破格）': ['论化气格']
  };

  // 十神到 b09 标题的映射
  private static readonly TEN_STAR_B09_MAP: Record<string, string[]> = {
    '正官': ['论正官'],
    '七杀': ['论七杀'],
    '偏官': ['论七杀'],
    '正印': ['论偏正印'],
    '偏印': ['论偏正印'],
    '正财': ['论偏正财'],
    '偏财': ['论偏正财'],
    '食神': ['论食神'],
    '伤官': ['论伤官'],
    '比肩': ['论比劫禄刃'],
    '劫财': ['论比劫禄刃']
  };

  // 月支到月份数字的映射
  private static readonly BRANCH_MONTH_NUM_MAP: Record<string, number> = {
    '寅': 1, '卯': 2, '辰': 3, '巳': 4, '午': 5, '未': 6,
    '申': 7, '酉': 8, '戌': 9, '亥': 10, '子': 11, '丑': 12
  };

  // 月份数字到中文月份名称的映射
  private static readonly MONTH_NAME_MAP: Record<number, string> = {
    1: '正月', 2: '二月', 3: '三月', 4: '四月', 5: '五月', 6: '六月',
    7: '七月', 8: '八月', 9: '九月', 10: '十月', 11: '十一月', 12: '十二月'
  };

  /**
   * 批量验证标题是否在数据库中存在
   */
  private async filterExistingTitles(bookCode: string, titles: string[]): Promise<string[]> {
    if (titles.length === 0) return [];
    
    try {
      // 使用 IN 子句批量查询，提高性能
      const placeholders = titles.map(() => '?').join(',');
      const sql = `
        SELECT DISTINCT title 
        FROM paragraphs 
        WHERE book_code = ? AND title IN (${placeholders})
      `;
      const results = await this.databaseService.all<{ title: string }>(sql, [bookCode, ...titles]);
      
      // 返回数据库中存在的标题（保持原有顺序）
      const existingTitleSet = new Set(results.map(r => r.title));
      return titles.filter(title => existingTitleSet.has(title));
    } catch (error) {
      console.error(`Error filtering titles for ${bookCode}:`, error);
      return [];
    }
  }

  @Get('query')
  async query(@Query('bazi') bazi: string) {
    if (!bazi || bazi.length !== 8) {
      return { b01: [], b02: [], b03: [], b04: [], b05: [], b06: [], b07: [], b08: [], b09: [], b10: [], b11: [] };
    }

    const yearStem = bazi[0];
    const yearBranch = bazi[1];
    const dayStem = bazi[4];
    const dayBranch = bazi[5];
    const monthBranch = bazi[3];
    const hourStem = bazi[6];
    const hourBranch = bazi[7];
    
    const b02: string[] = [];
    const b03: string[] = [];
    const b04: string[] = [];
    const b05: string[] = [];
    const b06: string[] = [];
    const b07: string[] = [];
    const b08: string[] = [];
    const b09: string[] = [];
    const b10: string[] = [];
    const b11: string[] = [];

    const baziSystemData = this.baziService.buildBaziSystemDataFromString(bazi);
    const pattern = this.patternAnalyzer.analyzePatternFromBaziSystem(baziSystemData).pattern;
    console.log(pattern)

    if (DocsController.PATTERN_MAP[pattern]) {
      b02.push(DocsController.PATTERN_MAP[pattern]);
    }

    b02.push(`论${dayStem}日干`);

    // b03: 日时组合
    b03.push(`${dayStem}${dayBranch}日${hourStem}${hourBranch}时`);

    // b03: 论日干标题
    b03.push(`论${dayStem}日干`);

    // b03: 论日干生月标题
    b03.push(`论${dayStem}生${monthBranch}月`);

    // b03: 五行相关的标题（日干对应的五行）
    if (DocsController.STEM_WUXING_MAP[dayStem]) {
      b03.push(`论${DocsController.STEM_WUXING_MAP[dayStem]}生${monthBranch}月`);
    }

    // b04: 月日时组合
    b04.push(`${monthBranch}月${dayStem}日${hourStem}${hourBranch}时`);

    // b05: 格局和十神相关的标题
    // 1. 根据格局生成标题（特殊格局优先）
    if (DocsController.PATTERN_B05_MAP[pattern]) {
      b05.push(...DocsController.PATTERN_B05_MAP[pattern]);
    } else {
      // 2. 对于普通格局，根据格局名称提取十神信息
      const patternTenStarMap: Record<string, string> = {
        '正官格': '正官', '七杀格': '七杀', '伤官格': '伤官',
        '正财格': '正财', '偏财格': '偏财', '正印格': '正印', '偏印格': '偏印',
        '食神格': '食神',
        '正官格（破格）': '正官', '七杀格（破格）': '七杀', '伤官格（破格）': '伤官',
        '正财格（破格）': '正财', '偏财格（破格）': '偏财', '正印格（破格）': '正印', '偏印格（破格）': '偏印',
        '食神格（破格）': '食神',
        // 杂气格
        '杂气正官格': '正官', '杂气七杀格': '七杀', '杂气伤官格': '伤官',
        '杂气正财格': '正财', '杂气偏财格': '偏财', '杂气正印格': '正印', '杂气偏印格': '偏印',
        '杂气食神格': '食神',
        '杂气正官格（破格）': '正官', '杂气七杀格（破格）': '七杀', '杂气伤官格（破格）': '伤官',
        '杂气正财格（破格）': '正财', '杂气偏财格（破格）': '偏财', '杂气正印格（破格）': '正印', '杂气偏印格（破格）': '偏印',
        '杂气食神格（破格）': '食神'
      };
      
      const tenStar = patternTenStarMap[pattern];
      if (tenStar && DocsController.TEN_STAR_B05_MAP[tenStar]) {
        b05.push(...DocsController.TEN_STAR_B05_MAP[tenStar]);
      } else {
        // 3. 如果没有匹配的格局，根据月干十神生成标题
        const monthTenStar = baziSystemData.month.tenStar;
        if (DocsController.TEN_STAR_B05_MAP[monthTenStar]) {
          b05.push(...DocsController.TEN_STAR_B05_MAP[monthTenStar]);
        }
      }
    }

    // 4. 对于需要"取运"的格局，添加"取运"标题
    const hasQuyunPattern = ['正官格', '七杀格', '伤官格', '正财格', '偏财格', '正印格', '偏印格', '食神格', 
                              '正官格（破格）', '七杀格（破格）', '伤官格（破格）', '正财格（破格）', '偏财格（破格）', 
                              '正印格（破格）', '偏印格（破格）', '食神格（破格）',
                              '杂气正官格', '杂气七杀格', '杂气伤官格', '杂气正财格', '杂气偏财格', 
                              '杂气正印格', '杂气偏印格', '杂气食神格',
                              '杂气正官格（破格）', '杂气七杀格（破格）', '杂气伤官格（破格）', 
                              '杂气正财格（破格）', '杂气偏财格（破格）', '杂气正印格（破格）', 
                              '杂气偏印格（破格）', '杂气食神格（破格）',
                              '建禄格', '建禄格（破格）', '羊刃格', '羊刃格（破格）'].includes(pattern);
    
    if (hasQuyunPattern && b05.length > 0) {
      b05.push(b05[0] + '取运');
    }

    // b06: 月份、格局、十神、日干相关的标题
    // 1. 月份相关标题
    const monthInfo = DocsController.BRANCH_MONTH_MAP[monthBranch];
    if (monthInfo) {
      b06.push(`论${monthBranch}月`);
      b06.push(`论${monthInfo.name}`);
    }

    // 2. 格局相关标题
    if (DocsController.PATTERN_B06_MAP[pattern]) {
      b06.push(...DocsController.PATTERN_B06_MAP[pattern]);
    }

    // 3. 十神相关标题（根据格局或月干十神）
    const patternTenStarMap: Record<string, string> = {
      '正官格': '正官', '七杀格': '七杀', '伤官格': '伤官',
      '正财格': '正财', '偏财格': '偏财', '正印格': '正印', '偏印格': '偏印',
      '食神格': '食神',
      '正官格（破格）': '正官', '七杀格（破格）': '七杀', '伤官格（破格）': '伤官',
      '正财格（破格）': '正财', '偏财格（破格）': '偏财', '正印格（破格）': '正印', '偏印格（破格）': '偏印',
      '食神格（破格）': '食神',
      // 杂气格
      '杂气正官格': '正官', '杂气七杀格': '七杀', '杂气伤官格': '伤官',
      '杂气正财格': '正财', '杂气偏财格': '偏财', '杂气正印格': '正印', '杂气偏印格': '偏印',
      '杂气食神格': '食神',
      '杂气正官格（破格）': '正官', '杂气七杀格（破格）': '七杀', '杂气伤官格（破格）': '伤官',
      '杂气正财格（破格）': '正财', '杂气偏财格（破格）': '偏财', '杂气正印格（破格）': '正印', '杂气偏印格（破格）': '偏印',
      '杂气食神格（破格）': '食神'
    };
    
    const tenStar = patternTenStarMap[pattern] || baziSystemData.month.tenStar;
    if (tenStar && DocsController.TEN_STAR_B06_MAP[tenStar]) {
      b06.push(...DocsController.TEN_STAR_B06_MAP[tenStar]);
    }

    // 4. 日干相关标题
    b06.push(`论日干${dayStem}`);

    // b07: 日柱、时柱和日干总论
    b07.push(`${dayStem}${dayBranch}日柱`);
    b07.push(`${hourStem}${hourBranch}时柱`);
    
    // 日干总论：根据日干五行生成
    const dayWuxing = DocsController.STEM_WUXING_MAP[dayStem];
    if (dayWuxing) {
      b07.push(`${dayStem}${dayWuxing}总论`);
    }

    // b08: 日干体象、地支宫咏
    // 1. 日干体象：根据日干五行生成
    if (dayWuxing) {
      b08.push(`${dayStem}${dayWuxing}体象`);
    }

    // 2. 地支宫咏：根据月支生成
    b08.push(`${monthBranch}宫支咏`);

    // 3. 金不换髓歌：暂时不做处理
    // TODO: 后续实现金不换髓歌相关逻辑

    // b09: 格局和十神相关的标题
    // 1. 根据格局生成标题
    if (DocsController.PATTERN_B09_MAP[pattern]) {
      b09.push(...DocsController.PATTERN_B09_MAP[pattern]);
    } else {
      // 2. 对于普通格局，根据格局名称提取十神信息
      const patternTenStarMap: Record<string, string> = {
        '正官格': '正官', '七杀格': '七杀', '伤官格': '伤官',
        '正财格': '正财', '偏财格': '偏财', '正印格': '正印', '偏印格': '偏印',
        '食神格': '食神', '比肩格': '比肩', '劫财格': '劫财',
        '正官格（破格）': '正官', '七杀格（破格）': '七杀', '伤官格（破格）': '伤官',
        '正财格（破格）': '正财', '偏财格（破格）': '偏财', '正印格（破格）': '正印', '偏印格（破格）': '偏印',
        '食神格（破格）': '食神', '比肩格（破格）': '比肩', '劫财格（破格）': '劫财',
        // 杂气格
        '杂气正官格': '正官', '杂气七杀格': '七杀', '杂气伤官格': '伤官',
        '杂气正财格': '正财', '杂气偏财格': '偏财', '杂气正印格': '正印', '杂气偏印格': '偏印',
        '杂气食神格': '食神', '杂气比肩格': '比肩', '杂气劫财格': '劫财',
        '杂气正官格（破格）': '正官', '杂气七杀格（破格）': '七杀', '杂气伤官格（破格）': '伤官',
        '杂气正财格（破格）': '正财', '杂气偏财格（破格）': '偏财', '杂气正印格（破格）': '正印', '杂气偏印格（破格）': '偏印',
        '杂气食神格（破格）': '食神', '杂气比肩格（破格）': '比肩', '杂气劫财格（破格）': '劫财'
      };
      
      const tenStar = patternTenStarMap[pattern];
      if (tenStar && DocsController.TEN_STAR_B09_MAP[tenStar]) {
        b09.push(...DocsController.TEN_STAR_B09_MAP[tenStar]);
        // 如果有格局，也添加格局标题
        if (pattern.includes('格') && !pattern.includes('破格')) {
          b09.push(`论${pattern}`);
        }
      } else {
        // 3. 如果没有匹配的格局，根据月干十神生成标题
        const monthTenStar = baziSystemData.month.tenStar;
        if (DocsController.TEN_STAR_B09_MAP[monthTenStar]) {
          b09.push(...DocsController.TEN_STAR_B09_MAP[monthTenStar]);
        }
      }
    }

    // b10: 日时组合、月份节气、年柱、日干、日柱相关的标题
    // 1. 日时组合（带"论"）
    b10.push(`论${dayStem}${dayBranch}日${hourStem}${hourBranch}时`);

    // 2. 月份节气
    const monthNum = DocsController.BRANCH_MONTH_NUM_MAP[monthBranch];
    if (monthNum && DocsController.MONTH_NAME_MAP[monthNum]) {
      b10.push(`论${DocsController.MONTH_NAME_MAP[monthNum]}节气`);
    }

    // 3. 年柱
    b10.push(`论年柱${yearStem}${yearBranch}`);

    // 4. 日干（包括天干和五行）
    b10.push(`论日干${dayStem}`);
    if (dayWuxing) {
      b10.push(`论日干${dayWuxing}`);
    }

    // 5. 日柱
    b10.push(`论日柱${dayStem}${dayBranch}`);

    // b11: 年柱和日柱相关的标题
    // 1. 年柱
    b11.push(`论年柱${yearStem}${yearBranch}`);

    // 2. 日柱
    b11.push(`论日柱${dayStem}${dayBranch}`);

    // 验证并过滤标题，只返回数据库中存在的标题
    const [b01Filtered, b02Filtered, b03Filtered, b04Filtered, b05Filtered, 
           b06Filtered, b07Filtered, b08Filtered, b09Filtered, b10Filtered, b11Filtered] = await Promise.all([
      this.filterExistingTitles('b01', [`论${dayStem}生${monthBranch}月`]),
      this.filterExistingTitles('b02', b02),
      this.filterExistingTitles('b03', b03),
      this.filterExistingTitles('b04', b04),
      this.filterExistingTitles('b05', b05),
      this.filterExistingTitles('b06', b06),
      this.filterExistingTitles('b07', b07),
      this.filterExistingTitles('b08', b08),
      this.filterExistingTitles('b09', b09),
      this.filterExistingTitles('b10', b10),
      this.filterExistingTitles('b11', b11)
    ]);

    return {
      b01: b01Filtered,
      b02: b02Filtered,
      b03: b03Filtered,
      b04: b04Filtered,
      b05: b05Filtered,
      b06: b06Filtered,
      b07: b07Filtered,
      b08: b08Filtered,
      b09: b09Filtered,
      b10: b10Filtered,
      b11: b11Filtered
    };
  }

  /**
   * 根据书籍 id 和标题名称查询内容
   */
  @Get('content')
  async getContent(@Query('bookId') bookId: string, @Query('title') title: string) {
    if (!bookId || !title) {
      return { contents: [], error: 'bookId and title are required' };
    }

    try {
      // 构建 book_code，例如 b01, b02 等
      const bookCode = `b${String(bookId).padStart(2, '0')}`;
      
      // 查询数据库，返回所有匹配的记录
      const sql = `
        SELECT original_text, translated_text, annotations, order_num
        FROM paragraphs
        WHERE book_code = ? AND title = ?
        ORDER BY order_num ASC
      `;
      
      const results = await this.databaseService.all(sql, [bookCode, title]);
      
      if (!results || results.length === 0) {
        return { contents: [], error: 'Content not found' };
      }

      return {
        contents: results.map((result: any) => ({
          originalText: result.original_text,
          translatedText: result.translated_text,
          annotations: result.annotations ? JSON.parse(result.annotations) : null,
          orderNum: result.order_num
        }))
      };
    } catch (error) {
      console.error('Error querying content:', error);
      return { contents: [], error: error.message };
    }
  }
}
